# -*- coding: utf-8 -*-
"""
法码三因子选股:
具体选股方式：每周五计算每个股票的总市值*市净率，选出该值最小的五只股票.
筛选要求：
剔除st股，剔除pb<=0的股票
修改记录：
2016-7-9  苏振裕，原来是每周5计算一次，现在改为每天计算一次
"""
import pandas as pd
import os

from stock_py.config import config as conf
from stock_py.tools.database import stock_db as mydb

# 结算结果存放目录
calc_result_path = conf.g_var.calc_result_path
calc_result_path2 = conf.g_var.calc_result_path2

def fama_3f(conn):
    '''使用三因子模型计算每个股票的得分，即总市值*市盈率'''
    # 看看今天是否星期5,星期6也可以，可以延迟一天计算嘛
    #week = gt.which_week()
    #if week<5:
    #    return None
    # 获取周五的日期
    #date = gt.friday_date()
    sql = " select max(dates) from stock_qx "
    dates = pd.read_sql(sql,conn).ix[0,0]
    # 需要总市值*市净率
    # 排除st,市盈率为负的
    sql = r"""select code,name,dates,total_value,pb 
from stock_qx where dates='limit_date' 
 and name not like '%ST%' and pb>0"""
    sql = sql.replace('limit_date',dates)
    data = pd.read_sql(sql,conn)
    data.columns =[col.lower() for col in data.columns]  # 列名转小写
    # 计算三因子结果：
    data['f3']=data['total_value']*data['pb']
    data['f3'] = data['f3'].apply(lambda s:round(s,2))
    # 排序,升序排序
    data2= data.sort_values('f3')
    # 添加排序序号
    data2['rank']=range(1,len(data2)+1)
    data2[:3]
    # 除了返回计算结果，也要返回计算的数据日期
    return data2, dates


def main(logger=''):
    # 导入日志
    logger = conf.get_log()
    logger.info('---------------------------------------')
    # 获取数据库连接
    conn = mydb.connect()
    logger.info('连接数据库成功，开始计算砝码三因子选股计算')
    #------------------------------------------------
    # 开始计算
    fama_3f_df,dates = fama_3f(conn)
    #------------------------------------------------
    # 1.先在数据目录下备份计算结果
    calc_file = '砝码三因子选股f3计算结果_'+dates+'.csv'
    calc_file1 = os.path.join(calc_result_path,calc_file)  # 存放每天计算的结果
    fama_3f_df.to_csv(calc_file1,index=False)
    
    calc_file2 = '砝码三因子选股f3计算结果.csv'
    calc_file2 = os.path.join(calc_result_path2,calc_file2)  # 只存放最新一份，方便在办公室直接读取结果
    fama_3f_df.to_csv(calc_file2,index=False)
    
    #------------------------------------------------
    # 2.转成数据框，然后入库
    table = 'stock_f3'
    # 先删除今天的数据
    mydb.delete_today_data(conn,table,date=dates)
    # 入库
    mydb.df_into_db(conn,table,fama_3f_df,types='insert')
    logger.info('完成计算砝码三因子选股计算，删除今天的数据，入库成功，程序将退出')
    
if __name__ == '__main__':
    main()
